#!/usr/bin/env python
"""
将文件分割成很多部分，join.py将它们合并回去；
这是标准的Unix split命令行工具的一个可移植版本，因为它用Python写成，所以在Windows下也能工作和方便的修改；
因为它包装成一个函数，所以它的逻辑业务也可以由其他命令程序导入并重复使用。
"""

import sys
import os


def split(fromfile, todir, chunksize=1024 * 1024):
    if not os.path.exists(todir):
        os.mkdir(todir)
    else:
        input('即将删除{}下的所有内容，按回车键继续……'.format(todir))
        for eachfile in os.listdir(todir):
            os.remove(os.path.join(todir, eachfile))
    partsnum = 0
    infile = open(fromfile, 'rb')

    while True:
        chunk = infile.read(chunksize)

        if not chunk:
            break

        partsnum += 1

        filename = os.path.join(todir, 'part{:0>10}'.format(partsnum))
        part = open(filename, 'wb')
        part.write(chunk)
        part.close()

    infile.close()
    assert partsnum <= 9999999999, "文件过大"
    return partsnum


def command():
    if len(sys.argv) == 2 and (sys.argv[1] == '--help' or sys.argv[1] == '-h'):
        print('Use: ./split.py [file-to-split target-dir [chunksize]]')
    else:
        chunksize = 1024 * 1024

        if len(sys.argv) < 3:
            interact = True
            fromfile = input('请输出要分割的文件：')
            todir = 'splited_' + os.path.basename(fromfile)
            todir = input(
                '请输入存储分割后的文件的目录（回车后默认{}）：'.format(todir)
            ) or todir
            chunksize = input('请输入分割后文件kb大小（回车后默认1024）：') or 1024
            chunksize = int(chunksize) * 1024
        else:
            interact = False
            fromfile, todir = sys.argv[1: 3]
            if len(sys.argv) == 4:
                chunksize = int(sys.argv[3]) * 1024

        absfrom, absto = map(os.path.abspath, [fromfile, todir])
        print('将{}分割到{}中，每个文件{}kb'.format(absfrom, absto, chunksize / 1024))

        try:
            partsnum = split(fromfile, todir, chunksize=chunksize)
        except Exception:
            print('分割失败')
            print(sys.exc_info()[0], sys.exc_info()[1])
        else:
            print('分隔成功：{}个分割文件在{}中'.format(partsnum, absto))
        if interact:
            input('按回车键退出……')


if __name__ == '__main__':
    command()
